package com.wch.clientdemo.module.base.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.wch.clientdemo.module.base.config.MenuModule;

/**
 * 
 * @author WanChengHe
 * @Date 20181112 xml文件解析工具
 * 
 */
public class MenuXmlParseUtil {

	/**
	 * xml文件解析
	 * 
	 * @param xmlParser
	 * @return
	 */

	public static List<MenuModule> parseMenuConfig(XmlPullParser xmlParser) {
		try {
			if (null == xmlParser) {
				return null;
			}

			List<MenuModule> menuModuleList = new ArrayList<MenuModule>();
			while (xmlParser.next() != XmlPullParser.END_DOCUMENT) {
				if (xmlParser.getEventType() != XmlPullParser.START_TAG) {
					continue;
				}
				String name = xmlParser.getName();
				if ("application".equals(name)) {

				} else if ("module".equals(name)) {
					MenuModule m = readModule(xmlParser, name);
					menuModuleList.add(m);
				} else {
					skip(xmlParser);
				}

			}

			return menuModuleList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 对不需要解析的节点进行跳过
	 * 
	 * @param xmlParser
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	private static void skip(XmlPullParser xmlParser)
			throws XmlPullParserException, IOException {
		// 加一层判断，如果传入的不是开始的节点，则是非法状态
		if (xmlParser.getEventType() != XmlPullParser.START_TAG) {
			throw new IllegalStateException();
		}
		// 记录节点层级，如果是下一个标识是节点结束，则完毕；如果下一个是另一个节点的开发，那进入更深一层节点
		int depth = 1;
		while (0 != depth) {
			switch (xmlParser.next()) {
			case XmlPullParser.END_TAG:
				depth--;
				break;
			case XmlPullParser.START_TAG:
				depth++;
				break;
			}

		}

	}

	/**
	 * 对菜单节点进行解析
	 * 
	 * @param xmlParser
	 * @param name
	 * @return
	 */
	private static MenuModule readModule(XmlPullParser xmlParser, String tag) {

		try {
			xmlParser.require(XmlPullParser.START_TAG, null, tag);

			String name = xmlParser.getAttributeValue(null, "name");
			String className = xmlParser.getAttributeValue(null, "className");
			String icon = xmlParser.getAttributeValue(null, "icon");

			MenuModule menu = new MenuModule();
			menu.name = name;
			menu.className = className;
			menu.icon = icon;

			return menu;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}
